home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mttextfi.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  14.3 KB  |  473 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtTextfiles;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *-----------+----------+------+----------------------------------------*)
  29.  
  30.  
  31.  
  32. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  33. (*                                              *)
  34. (*$R-   Range-Checks                            *)
  35. (*$S-   Stack-Check                             *)
  36. (*                                              *)
  37. (*----------------------------------------------*)
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  45.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  46.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  47.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  48.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  49.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  50.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  51.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  61.  
  62.  
  63.  
  64.  
  65. FROM SYSTEM             IMPORT  ADDRESS, ADR, TSIZE;
  66. FROM MagicStrings       IMPORT  Assign, Append, Length, Equal;
  67. FROM MagicConvert       IMPORT  CardToStr, IntToStr, LCardToStr,
  68.                                 LIntToStr, LRealToStr, RealToStr,
  69.                                 StrToCard, StrToInt, StrToLCard,
  70.                                 StrToLInt, StrToReal, StrToLReal;
  71. FROM MagicDOS           IMPORT  ReadOnly, Hidden, System, Volume, Folder,
  72.                                 Archive, Fcreate, NamePRN, NameAUX, NameCON,
  73.                                 Read, Write, StdIn, StdOut, Serial, Printer,
  74.                                 Fopen, Fclose, Fread, Fwrite, Fdelete, ReadWrite,
  75.                                 SeekStart, SeekPos, SeekEnd, Fseek, Fattrib;
  76.                                 
  77.  
  78. CONST   cMax =          07FFFH;
  79.  
  80. CONST   cr =            15C;
  81.         lf =            12C;
  82.         ctrlZ =         32C;
  83.  
  84. TYPE    tBuffer =       POINTER TO ARRAY [0..cMax] OF CHAR;
  85.  
  86. TYPE    TEXTFILE =      POINTER TO Textfile;
  87.         Textfile =      RECORD
  88.                          name:  ARRAY [0..255] OF CHAR;
  89.                          mode:  Textmode;  (* Modus *)
  90.                          file:  sINTEGER;  (* Filehandle *)
  91.                          size:  lCARDINAL; (* Gr”že des Puffers (0..xxx) *)
  92.                          count: lCARDINAL; (* Anzahl der gelesenen Bytes *)
  93.                          fptr:  lCARDINAL; (* Schreib/Lesepos im File *)
  94.                          bptr:  sCARDINAL; (* Schreib/Lesepos im Puffer *)
  95.                          buff:  tBuffer;   (* Der Puffer pers”nlich *)
  96.                          eof:   BOOLEAN;   (* TRUE, wenn Ende der Datei erreicht *)
  97.                         END;
  98.  
  99.  
  100. PROCEDURE OpenTextfile (REF fname: ARRAY OF CHAR; modus: Textmode; puffer: CARDINAL;
  101.                         VAR text: TEXTFILE): BOOLEAN;
  102. VAR i: sINTEGER;
  103.     l: lCARDINAL;
  104. BEGIN
  105.  ALLOCATE (text,  TSIZE (Textfile));  
  106.  IF text = NIL THEN  RETURN FALSE;  END;
  107.  WITH text^ DO
  108.   Assign (fname, text^.name);  mode:= modus;  bptr:= 0;  eof:= FALSE;
  109.   IF (puffer = 0) OR (puffer > cMax) THEN  size:= LONG (cMax);
  110.                                      ELSE  size:= LONG (puffer);
  111.   END;
  112.   ALLOCATE (buff,  size);  
  113.   IF buff = NIL THEN  
  114.     size := 512;
  115.     ALLOCATE (buff, size);
  116.     IF buff = NIL THEN  DEALLOCATE (text, 0);    RETURN FALSE;  END;
  117.   END;
  118.   CASE mode OF
  119.    READ:        file:= Fopen (name, Read);
  120.                 IF file < 0 THEN
  121.                  DEALLOCATE (buff, 0);   DEALLOCATE (text, 0);  
  122.                  RETURN FALSE;
  123.                 END;
  124.                 count:= size;
  125.                 (* fptr := Fseek (0, file, SeekStart); *)
  126.                 fptr := 0;
  127.                 Fread (file, count, buff);
  128.                 bptr:= 0;  eof:= count = 0;|
  129.    WRITE:       file:= Fcreate (name, {});
  130.                 IF file < 0 THEN
  131.                  DEALLOCATE (buff, 0);   DEALLOCATE (text, 0);  
  132.                  RETURN FALSE;
  133.                 END;
  134.                 (* fptr:= Fseek (0, file, SeekStart); *)
  135.                 fptr := 0;
  136.                 bptr:= 0;  count:= 0;  eof:= FALSE;|
  137.    APPEND:      file:= Fopen (name, {Write});
  138.                 IF file < 0 THEN
  139.                  DEALLOCATE (buff, 0);   DEALLOCATE (text, 0);  
  140.                  RETURN FALSE;
  141.                 END;
  142.                 fptr:= Fseek (0, file, SeekEnd);
  143.                 bptr:= 0;  count:= 0;  eof:= FALSE;|
  144.   ELSE ;
  145.   END;
  146.  END;
  147.  RETURN TRUE;
  148. END OpenTextfile;
  149.  
  150. PROCEDURE FlushBuffer (text: TEXTFILE);
  151. BEGIN
  152.  IF text # NIL THEN
  153.   WITH text^ DO
  154.    IF (mode # READ) AND (bptr > 0) THEN
  155.     count:= LONG (bptr);  bptr:= 0;
  156.     Fwrite (file, count, buff);
  157.    END; (* IF *)
  158.   END; (* WITH *)
  159.  END; (* IF *)
  160. END FlushBuffer;
  161.  
  162. PROCEDURE ReadBuffer (text: TEXTFILE);
  163. BEGIN
  164.  IF text # NIL THEN
  165.   WITH text^ DO
  166.    IF mode = READ THEN
  167.     fptr:= Fseek (0, file, SeekPos);
  168.     count:= size;
  169.     Fread (file, count, buff);
  170.     bptr:= 0;  eof:= count = 0;
  171.    END; (* IF *)
  172.   END; (* WITH *)
  173.  END; (* IF *)
  174. END ReadBuffer;
  175.  
  176. PROCEDURE CloseTextfile (VAR text: TEXTFILE);
  177. VAR i: sINTEGER;
  178. BEGIN
  179.  IF text # NIL THEN
  180.   FlushBuffer (text);
  181.   i:= Fclose (text^.file);
  182.   DEALLOCATE (text^.buff, 0);  
  183.   DEALLOCATE (text, 0);  
  184.  END; 
  185. END CloseTextfile;
  186.  
  187. PROCEDURE Reset (text: TEXTFILE);
  188. VAR l: lCARDINAL;
  189. BEGIN
  190.  IF text # NIL THEN
  191.   WITH text^ DO
  192.    CASE mode OF
  193.     READ:   count:= size;
  194.             fptr:= Fseek (0, file, SeekStart);
  195.             Fread (file, count, buff);
  196.             bptr:= 0;  eof:= count = 0;|
  197.     WRITE:  FlushBuffer (text);
  198.             fptr:= Fseek (0, file, SeekStart);
  199.             bptr:= 0;  count:= 0;  eof:= FALSE;|
  200.     APPEND: fptr:= Fseek (fptr, file, SeekStart);
  201.             bptr:= 0;  count:= 0;  eof:= FALSE;|
  202.    END; 
  203.   END; 
  204.  END;
  205. END Reset;
  206.  
  207. PROCEDURE Textpos (text: TEXTFILE): lCARDINAL;
  208. VAR l: lCARDINAL;
  209. BEGIN
  210.  IF text # NIL THEN
  211.   RETURN text^.fptr + LONG (text^.bptr);
  212.  END; 
  213. END Textpos;
  214.  
  215. PROCEDURE SetTextpos (text: TEXTFILE; pos: lCARDINAL);
  216. VAR l: lCARDINAL;
  217. BEGIN
  218.  IF text # NIL THEN
  219.   WITH text^ DO
  220.    CASE mode OF
  221.     READ:   count:= size;
  222.             fptr:= Fseek (pos, file, SeekStart);
  223.             Fread (file, count, buff);
  224.             bptr:= 0;  eof:= count = 0;|
  225.     WRITE:  FlushBuffer (text);
  226.             fptr:= Fseek (pos, file, SeekStart);
  227.             bptr:= 0;  count:= 0;  eof:= FALSE;|
  228.     APPEND: FlushBuffer (text);
  229.             fptr:= Fseek (pos, file, SeekStart);
  230.             bptr:= 0;  count:= 0;  eof:= FALSE;|
  231.    END; 
  232.   END; 
  233.  END;
  234. END SetTextpos;
  235.  
  236. PROCEDURE EndofText (text: TEXTFILE): BOOLEAN;
  237. BEGIN
  238.  IF text # NIL THEN  RETURN text^.eof;  END;
  239.  RETURN FALSE;
  240. END EndofText;
  241.  
  242. PROCEDURE WriteChar (text: TEXTFILE; ch: CHAR);
  243. BEGIN
  244.  IF text # NIL THEN
  245.   WITH text^ DO
  246.    IF (mode # READ) THEN
  247.     buff^[bptr]:= ch;  INC (bptr);
  248.     IF LONG (bptr) >= size THEN  FlushBuffer (text);  END;
  249.    END; (* IF *)
  250.   END; (* WITH *)
  251.  END; (* IF *)
  252. END WriteChar;
  253.  
  254. PROCEDURE WriteLine (text: TEXTFILE; REF string: ARRAY OF CHAR); 
  255.  
  256. VAR c: CARDINAL;
  257. BEGIN
  258.  IF text # NIL THEN
  259.   WITH text^ DO
  260.    IF (mode # READ) THEN
  261.     FOR c:= 0 TO HIGH (string) DO
  262.      IF string[c] = 0C THEN  RETURN  END;
  263.      buff^[bptr]:= string[c];  INC (bptr);
  264.      IF LONG (bptr) >= size THEN  FlushBuffer (text);  END;
  265.     END; (* FOR *)
  266.    END; (* IF *)
  267.   END; (* WITH *)
  268.  END; (* IF *)
  269. END WriteLine;
  270.  
  271. PROCEDURE WriteConst (text: TEXTFILE; REF string: ARRAY OF CHAR);
  272. BEGIN
  273.  WriteLine (text, string);
  274. END WriteConst;
  275.  
  276. PROCEDURE WriteLn (text: TEXTFILE);
  277. BEGIN
  278.  WriteChar (text, cr);
  279.  WriteChar (text, lf);
  280. END WriteLn;
  281.  
  282. VAR string: ARRAY [0..255] OF CHAR;
  283.  
  284. PROCEDURE WriteCard (text: TEXTFILE; wert: sCARDINAL; len: sCARDINAL);
  285. BEGIN
  286.  CardToStr (wert, len, string);
  287.  WriteLine (text, string);
  288. END WriteCard;
  289.  
  290. PROCEDURE WriteInt (text: TEXTFILE; wert: sINTEGER; len: sCARDINAL);
  291. BEGIN
  292.  IntToStr (wert, len, string);
  293.  WriteLine (text, string);
  294. END WriteInt;
  295.  
  296. PROCEDURE WriteLongCard (text: TEXTFILE; wert: lCARDINAL; len: sCARDINAL);
  297. BEGIN
  298.  LCardToStr (wert, len, string);
  299.  WriteLine (text, string);
  300. END WriteLongCard;
  301.  
  302. PROCEDURE WriteLongInt (text: TEXTFILE; wert: lINTEGER; len: sCARDINAL);
  303. BEGIN
  304.  LIntToStr (wert, len, string);
  305.  WriteLine (text, string);
  306. END WriteLongInt;
  307.  
  308. PROCEDURE WriteReal (text: TEXTFILE; wert: REAL; len: sCARDINAL);
  309. BEGIN
  310.  RealToStr (wert, len, string);
  311.  WriteLine (text, string);
  312. END WriteReal;
  313.  
  314. PROCEDURE WriteLongReal (text: TEXTFILE; wert: LONGREAL; len: sCARDINAL);
  315. BEGIN
  316.  LRealToStr (wert, len, string);
  317.  WriteLine (text, string);
  318. END WriteLongReal;
  319.  
  320. PROCEDURE ReadChar (text: TEXTFILE; VAR c: CHAR);
  321. BEGIN
  322.  IF text # NIL THEN
  323.   WITH text^ DO
  324.    IF (mode = READ) THEN
  325.     IF eof THEN  c:= 0C;  RETURN;  END;
  326.     c:= buff^[bptr];
  327.     IF LONG (bptr) = count - LONG (1) THEN  ReadBuffer (text);
  328.                                       ELSE  INC (bptr);
  329.     END; (* IF *)
  330.    END; (* IF *)
  331.   END; (* WITH *)
  332.  END; (* IF *)
  333. END ReadChar;
  334.  
  335. PROCEDURE ReadLine (text: TEXTFILE; VAR str: ARRAY OF CHAR);
  336. VAR c: CARDINAL;
  337. BEGIN
  338.  IF text # NIL THEN
  339.   WITH text^ DO
  340.    IF mode = READ THEN
  341.     c:= 0;
  342.     LOOP
  343.      IF eof THEN  str[c]:= 0C;  RETURN;  END;
  344.      IF c > HIGH (str) THEN  RETURN  END;
  345.      str[c]:= buff^[bptr];
  346.      IF (str[c] = cr) OR (str[c] = lf) THEN
  347.        str[c] := 0c; RETURN
  348.      ELSE
  349.       IF LONG (bptr) = count - LONG (1) THEN  ReadBuffer (text);
  350.                                         ELSE  INC (bptr);
  351.       END;
  352.      END;
  353.      INC (c);
  354.     END; (* LOOP *)
  355.    END; (* IF *)
  356.   END; (* WITH *)
  357.  END; (* IF *)
  358. END ReadLine;
  359.  
  360. PROCEDURE ReadLn (text: TEXTFILE);
  361. VAR ch: CHAR;
  362. BEGIN
  363.  IF text # NIL THEN
  364.   WITH text^ DO
  365.    IF (mode = READ) THEN
  366.     LOOP
  367.      ReadChar (text, ch);
  368. (*
  369.      IF (ch = 0C) OR (ch = lf) THEN RETURN 
  370.      ELSIF ch = cr
  371.      THEN
  372.                 IF eof THEN RETURN;  END;
  373.                 ch:= buff^[bptr];
  374.                 IF ch = lf
  375.                 THEN
  376.                   IF LONG (bptr) = count - LONG (1) THEN  ReadBuffer (text); 
  377.                                                     ELSE  INC (bptr);
  378.                                                     END;
  379.                 END; (* IF *)
  380.                 RETURN;
  381.      END;
  382. *)
  383.      CASE ch OF
  384.       0C:       RETURN;|
  385.       cr:       IF eof THEN RETURN;  END;
  386.                 ch:= buff^[bptr];
  387.                 IF ch = lf
  388.                 THEN
  389.                   IF LONG (bptr) = count - LONG (1) THEN  ReadBuffer (text); 
  390.                                                     ELSE  INC (bptr);
  391.                                                     END;
  392.                 END; (* IF *)
  393.                 RETURN;|
  394.       lf:       RETURN;| 
  395.       ELSE      ;
  396.      END; (* CASE *)
  397.     END; (* LOOP *)
  398.    END; (* IF *)
  399.   END; (* WITH *)
  400.  END; (* IF *)
  401. END ReadLn;
  402.  
  403. PROCEDURE ReadSpec (text: TEXTFILE; REF check: ARRAY OF CHAR; VAR str: ARRAY OF CHAR);
  404. VAR c:  CARDINAL;
  405.     ch: CHAR;
  406.  
  407.  PROCEDURE Check (ch: CHAR): BOOLEAN;
  408.  VAR x: CARDINAL;
  409.  BEGIN
  410.   FOR x:= 0 TO HIGH (check) DO
  411.    IF ch = check[x] THEN  RETURN TRUE;  END;
  412.   END;
  413.   RETURN FALSE;
  414.  END Check;
  415.  
  416. BEGIN
  417.  str[0]:= 0C;  c:= 0;
  418.  IF text # NIL THEN
  419.   IF (text^.mode = READ) THEN
  420.    REPEAT
  421.     IF text^.eof THEN  RETURN;  END;
  422.     ReadChar (text, ch);
  423.    UNTIL Check (ch);
  424.    REPEAT
  425.     IF text^.eof THEN  str[c]:= 0C;  RETURN;  END;
  426.     str[c]:= ch;  ReadChar (text, ch);  INC (c);
  427.     IF c > HIGH (str) THEN  DEC (text^.bptr);  RETURN;
  428.     END;
  429.    UNTIL NOT Check (ch);
  430.    DEC (text^.bptr);  str[c]:= 0C;
  431.   END; (* IF *)
  432.  END; (* IF *)
  433. END ReadSpec;
  434.  
  435. PROCEDURE ReadCard (text: TEXTFILE; VAR wert: sCARDINAL);
  436. BEGIN
  437.  ReadSpec (text, '0123456789', string);
  438.  wert:= StrToCard (string);
  439. END ReadCard;
  440.  
  441. PROCEDURE ReadInt (text: TEXTFILE; VAR wert: sINTEGER);
  442. BEGIN
  443.  ReadSpec (text, '+-0123456789', string);
  444.  wert:= StrToInt (string);
  445. END ReadInt;
  446.  
  447. PROCEDURE ReadLongCard (text: TEXTFILE; VAR wert: lCARDINAL);
  448. BEGIN
  449.  ReadSpec (text, '0123456789', string);
  450.  wert:= StrToLCard (string);
  451. END ReadLongCard;
  452.  
  453. PROCEDURE ReadLongInt (text: TEXTFILE; VAR wert: lINTEGER);
  454. BEGIN
  455.  ReadSpec (text, '+-0123456789', string);
  456.  wert:= StrToLInt (string);
  457. END ReadLongInt;
  458.  
  459. PROCEDURE ReadReal (text: TEXTFILE; VAR wert: REAL);
  460. BEGIN
  461.  ReadSpec (text, '.+-0123456789E', string);
  462.  wert:= StrToReal (string);
  463. END ReadReal;
  464.  
  465. PROCEDURE ReadLongReal (text: TEXTFILE; VAR wert: LONGREAL);
  466. BEGIN
  467.  ReadSpec (text, '.+-0123456789E', string);
  468.  wert:= StrToLReal (string);
  469. END ReadLongReal;
  470.  
  471. END mtTextfiles.
  472.  
  473.